package cn.iocoder.yudao.module.brokerage.user.service;

import cn.iocoder.yudao.framework.business.basic.service.MemberExtensionService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.api.brokerage.level.enums.BrokerageLevelTypeEnum;
import cn.iocoder.yudao.module.api.member.agency.enums.AgencyLevelEnum;
import cn.iocoder.yudao.module.api.member.level.dto.MemberLevelRespDTO;
import cn.iocoder.yudao.module.api.member.vip.enums.VipLevelEnum;
import cn.iocoder.yudao.module.api.member.vip.vo.VipUserSummaryVO;
import cn.iocoder.yudao.module.brokerage.user.pojo.bo.BrokerageUserMonthSummaryBO;
import cn.iocoder.yudao.module.brokerage.user.pojo.po.BrokerageUserDO;
import cn.iocoder.yudao.module.brokerage.user.pojo.vo.AppBrokerageUserSummaryRespVO;
import cn.iocoder.yudao.module.brokerage.user.pojo.vo.AppBrokerageUserVO;

import java.util.List;

/**
 * 推广用户 Service 接口
 *
 * @author 山野羡民
 */
public interface AppBrokerageUserService extends MemberExtensionService<BrokerageUserDO> {

    /**
     * 自动同步推广信息，如推广关系、身份类型、邀请数量
     *
     * @param userId 用户编号
     * @param fatherUserId 用户编号
     */
    void autoSyncRelation(Long userId, Long fatherUserId);

    /**
     * 获得推广用户
     *
     * @param userId 用户编号
     * @return 分页信息
     */
    AppBrokerageUserVO getDetailByUserId(Long userId);

    /**
     * 获得推广数据汇总
     *
     * @param userId 用户编号
     * @return 人数
     */
    AppBrokerageUserSummaryRespVO getSummaryByUserId(Long userId);

    /**
     * 获得推广数据汇总
     *
     * @param userId 用户编号
     * @param year 年份
     * @param month 月份
     * @return 汇总信息
     */
    BrokerageUserMonthSummaryBO getSummaryByUserIdAndMonth(Long userId, Integer year, Integer month);

    /**
     * 最近半年推广数据汇总
     *
     * @param userId 用户编号
     * @return 汇总信息
     */
    List<BrokerageUserMonthSummaryBO> getByUserIdAndLastHalfYear(Long userId);

    /**
     * 直推间推用户分页（一二级推广用户）
     *
     * @param current 当前页码
     * @param size 每页条数
     * @param userId 用户编号
     * @return 分页信息
     */
    PageResult<AppBrokerageUserVO> getFatherAndGrandpaPage(Integer current, Integer size, Long userId);

    /**
     * 直推用户分页（一级推广用户）
     *
     * @param current 当前页码
     * @param size 每页条数
     * @param userId 用户编号
     * @return 分页信息
     */
    PageResult<AppBrokerageUserVO> getFatherPage(Integer current, Integer size, Long userId);

    /**
     * 间推用户分页（二级推广用户）
     *
     * @param current 当前页码
     * @param size 每页条数
     * @param userId 用户编号
     * @return 分页信息
     */
    PageResult<AppBrokerageUserVO> getGrandpaPage(Integer current, Integer size, Long userId);

    /**
     * 招商团队分页（推广的一二级招商人员）
     *
     * @param current 当前页码
     * @param size 每页条数
     * @param userId 用户编号
     * @return 分页信息
     */
    PageResult<AppBrokerageUserVO> getAgencyTeamPage(Integer current, Integer size, Long userId);

    /**
     * 直推会员分页（一级推广会员）
     *
     * @param current 当前页码
     * @param size 每页条数
     * @param userId 用户编号
     * @param valid 是否有效
     * @return 分页信息
     */
    PageResult<AppBrokerageUserVO> getVipPage(Integer current, Integer size, Long userId, Boolean valid);

    /**
     * 当前月度直推用户列表
     *
     * @param userId 用户编号
     * @param year 年份
     * @param month 月份
     * @return 列表信息
     */
    List<AppBrokerageUserVO> getFatherListByMonth(Long userId, Integer year, Integer month);

    /**
     * 更新统计信息，如邀请人数、累计佣金等
     *
     * @param userId 用户编号
     * @param fatherUserId 上级用户编号
     */
    void updateWhenBindSuccess(Long userId, Long fatherUserId);

    /**
     *  更新推广人员的等级
     *
     * @param userId 用户编号
     * @param type 类型，{@link BrokerageLevelTypeEnum}
     * @param level 等级，{@link MemberLevelRespDTO#getLevel()}/{@link VipLevelEnum}/{@link AgencyLevelEnum}
     */
    void updateLevelWeight(Long userId, Integer type, Integer level);

    /**
     * 获取直推人数
     *
     * @param userId     用户编号
     */
    int getFatherCount(Long userId);

    /**
     * 获取间推人数（限二级）
     *
     * @param userId     用户编号
     */
    int getGrandpaCount(Long userId);

    /**
     * 获取会员汇总
     *
     * @param userId     用户编号
     */
    VipUserSummaryVO getVipSummary(Long userId);

}